CreateUserCommandHandler   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 8
eloc 62
dl 0
loc 78
c 0
b 0
f 0
rs 10

2 Functions

Rating   Name   Duplication   Size   Complexity  
B createUserAdministrative 0 32 5
A execute 0 33 3
1
import { CommandHandler } from '@nestjs/cqrs';
2
import { Inject } from '@nestjs/common';
3
import {
4
  CreateUserCommand,
5
  IUserAdministrativeCommand
6
} from './CreateUserCommand';
7
import { IUserRepository } from 'src/Domain/HumanResource/User/Repository/IUserRepository';
8
import { IPasswordEncoder } from 'src/Application/IPasswordEncoder';
9
import { User, UserRole } from 'src/Domain/HumanResource/User/User.entity';
10
import { IsEmailAlreadyExist } from 'src/Domain/HumanResource/User/Specification/IsEmailAlreadyExist';
11
import { EmailAlreadyExistException } from 'src/Domain/HumanResource/User/Exception/EmailAlreadyExistException';
12
import { IUserAdministrativeRepository } from 'src/Domain/HumanResource/User/Repository/IUserAdministrativeRepository';
13
import { UserAdministrativeMissingException } from 'src/Domain/HumanResource/User/Exception/UserAdministrativeMissingException';
14
import { UserAdministrative } from 'src/Domain/HumanResource/User/UserAdministrative.entity';
15
16
@CommandHandler(CreateUserCommand)
17
export class CreateUserCommandHandler {
18
  constructor(
19
    @Inject('IUserAdministrativeRepository')
20
    private readonly userAdministrativeRepository: IUserAdministrativeRepository,
21
    @Inject('IUserRepository')
22
    private readonly userRepository: IUserRepository,
23
    @Inject('IPasswordEncoder')
24
    private readonly passwordEncoder: IPasswordEncoder,
25
    private readonly isEmailAlreadyExist: IsEmailAlreadyExist
26
  ) {}
27
28
  public async execute(command: CreateUserCommand): Promise<string> {
29
    const { firstName, lastName, password, role, userAdministrative } = command;
30
    const email = command.email.toLowerCase();
31
32
    if (true === (await this.isEmailAlreadyExist.isSatisfiedBy(email))) {
33
      throw new EmailAlreadyExistException();
34
    }
35
36
    if (UserRole.ACCOUNTANT !== role && !userAdministrative) {
37
      throw new UserAdministrativeMissingException();
38
    }
39
40
    const userAdmin = await this.createUserAdministrative(
41
      role,
42
      userAdministrative
43
    );
44
45
    const hashPassword = await this.passwordEncoder.hash(password);
46
    const apiToken = await this.passwordEncoder.hash(email + password);
47
    const user = await this.userRepository.save(
48
      new User(
49
        firstName,
50
        lastName,
51
        email,
52
        apiToken,
53
        hashPassword,
54
        role,
55
        userAdmin
56
      )
57
    );
58
59
    return user.getId();
60
  }
61
62
  private async createUserAdministrative(
63
    role: UserRole,
64
    userAdministrative?: IUserAdministrativeCommand
65
  ): Promise<UserAdministrative | null> {
66
    if (role === UserRole.ACCOUNTANT) {
67
      return null;
68
    }
69
70
    const {
71
      annualEarnings,
72
      contract,
73
      workingTime,
74
      executivePosition,
75
      healthInsurance,
76
      joiningDate,
77
      leavingDate,
78
      transportFee,
79
      sustainableMobilityFee
80
    } = userAdministrative;
81
82
    return await this.userAdministrativeRepository.save(
83
      new UserAdministrative(
84
        Math.round(annualEarnings * 100),
85
        healthInsurance,
86
        executivePosition,
87
        contract,
88
        workingTime,
89
        joiningDate,
90
        leavingDate ? leavingDate : null,
91
        transportFee ? Math.round(transportFee * 100) : 0,
92
        sustainableMobilityFee ? Math.round(sustainableMobilityFee * 100) : 0
93
      )
94
    );
95
  }
96
}
97